package com.imooc.controller;

import com.imooc.utils.JsonUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.io.UnsupportedEncodingException;
import java.util.Map;

/**
 * 测试微信公众号用的，
 * 实际开发中使用github上的第三方的sdk的方式
 */
@RestController
@RequestMapping("/weixin")
@Slf4j
public class WxTestController {
    
    /**
     * 获取access_token 公众号的全局唯一凭证
     * 手动获取方式
     * 一、获取code 换取 access_token
     * 1、直接请求测试
     * http://域名/sell/weixin/auth?code=123456
     * 2、微信回调测试
     * https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx5bf0950d88f6c3a2&redirect_uri=http://域名/sell/weixin/auth&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect
     * https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx5bf0950d88f6c3a2&redirect_uri=http://域名/sell/weixin/auth&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect
     *
     * 二、换取access_token
     * 尤其注意：由于公众号的secret和获取到的access_token安全级别都非常高，必须只保存在服务器，不允许传给客户端。
     * 后续刷新access_token、通过access_token获取用户信息等步骤，也必须从服务器发起。
     * 通过RestTemplate 由服务端模拟http请求
     * https://api.weixin.qq.com/sns/oauth2/access_token?appid=你的APPID&secret=你的SECRET&code=第一步获取的CODE&grant_type=authorization_code
     *
     * 三、刷新access_token(如果需要)
     * 获取第二步的refresh_token后，请求以下链接获取access_token：
     * https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=你的APPID&grant_type=refresh_token&refresh_token=第二步获取的REFRESH_TOKEN
     *
     * 四：拉取用户信息(需scope为 snsapi_userinfo)
     * http：GET（请使用https协议） https://api.weixin.qq.com/sns/userinfo?access_token=你的ACCESS_TOKEN&openid=获取的OPENID&lang=zh_CN
     *
     * 五、检验授权凭证（access_token）是否有效
     * http：GET（请使用https协议） https://api.weixin.qq.com/sns/auth?access_token=ACCESS_TOKEN&openid=OPENID
     *
     * @param code
     */
    @GetMapping("/auth")
    public void auth(@RequestParam("code") String code) {  // 1、接收回调的code
        log.info("进入auth方法。。。");
        log.info("code={}", code);

        // 2、获取code后，请求以下链接获取access_token：  https://api.weixin.qq.com/sns/oauth2/access_token?appid=wx5bf0950d88f6c3a2&secret=6f549c63bffe65e0308cb1736c67b58b&code=CODE&grant_type=authorization_code
        String access_token_url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=wx5bf0950d88f6c3a2&secret=6f549c63bffe65e0308cb1736c67b58b&code="+code+"&grant_type=authorization_code";
        RestTemplate restTemplate = new RestTemplate();
        String access_token_result = restTemplate.getForObject(access_token_url, String.class);
        log.info("response={}", access_token_result);
        
        Map toMap= JsonUtil.toMap(access_token_result);
        String refresh_token = (String) toMap.get("refresh_token");
        String openid = (String) toMap.get("openid");
        String access_token = (String) toMap.get("access_token");
        
        // 3、刷新 access_token
        // https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=你的APPID&grant_type=refresh_token&refresh_token=第二步获取的REFRESH_TOKEN
        String refresh_token_url="https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=wx5bf0950d88f6c3a2&grant_type=refresh_token&refresh_token="+refresh_token;
        String refresh_token_result = restTemplate.getForObject(refresh_token_url, String.class);
        log.info("response={}", refresh_token_result);
    
        // 4、获取用户信息
        String userinfo_url ="https://api.weixin.qq.com/sns/userinfo?access_token="+access_token+"&openid="+openid+"&lang=zh_CN";
        String userinfo_result = restTemplate.getForObject(userinfo_url, String.class);
        
        // 解决中文用户信息乱码问题，编码后的json
        try {
            userinfo_result = new String(userinfo_result.getBytes("ISO-8859-1"), "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    
        log.info("response={}", userinfo_result);
        
        // 5、验证access_token 有效性
        String auth_access_token_url = "https://api.weixin.qq.com/sns/auth?access_token="+toMap.get("access_token")+"&openid="+openid;
        String auth_access_token_result = restTemplate.getForObject(auth_access_token_url, String.class);
        log.info("response={}", auth_access_token_result);
    }
}
